<?php

/**
 * Klasse zum Verarbeiten und Validieren der Formularinhalte
 *
 * @author temimi
 */
class DataManager {
    private $variables;
    private $errorMessages;
    private $sourceData;



    /**
     * Erzeugt Manager und Initialisierung von Form Variablen
     * @param Array $vars Input Form Array of Vars
     */
    public function __construct($sourceData) {
        $this->sourceData = $sourceData;
        
    }

    /**
     * TODO: Dokumentieren
     *
     */
    public function __destruct() {
        //var_dump($this->errorMessages);
    }


    /**
     * Variablen bei der Manager Klasse registrieren
     */
    public function setVarData($varName,$lable,$message='',$callbackObject=null,$callback=null){
        $this->variables[$varName] = array(
                $lable,
                $message,
                $callbackObject,
                $callback

        );
    }


    /**
     * Validiert Gesamtformular
     * @return bool Daten insgesamt valide oder nicht
     */
    public function isValidData() {
        $dataIsValid = true;

        // Jedes Objekt mit seinem vorgesehenen Callback validieren
        foreach($this->variables as $key => $val){
            if($val[2] && $val[3]) {
                $varIsValid = call_user_func(array($val[2],$val[3]),$key,htmlspecialchars($this->sourceData[$key]));
                $dataIsValid = $dataIsValid && $varIsValid;

                if(!$varIsValid){
                    $this->errorMessages[$key] = $this->variables[$key][1];
                }
            }
        }

        return $dataIsValid;
    }


    /**
     * Stellt fest, ob es ein Invalides Feld gibt
     * @return bool
     */
    public function errorMessagesExist() {
        $errorExists = false;

        if (count($this->errorMessages) > 0 ){
            $errorExists = true;
        }

        return $errorExists;
    }


    /**
     * Gibt Fehlermeldungen zurück
     * @return String
     */
    public function getErrorMessages() {
        $content = '';

        $content .= implode('<br />', $this->errorMessages);
        
        return $content;
    }


    /**
     * Email verschicken
     * 
     * @param String $from
     * @param String $to
     * @param String $subject
     * @param String $text
     * @param String $html
     */
    function sendMail($from,$to,$subject,$text)
    {

        $boundary= uniqid("UOMAILER");
        $headers = "From: $from\r\n";
        $headers .= "MIME-Version: 1.0\r\n";
        $headers .= "Content-Type: text/plain; charset=utf8;\r\n\r\n";
        
        $to=explode(",",$to);

        for ($i=0;$i<count($to);$i++) {
            if ($to[$i]) {
                mail($to[$i],$subject,$text,$headers);
            }
        }
    }

    //////// Validation Callbacks  ////////

    /**
     * Callback: validiert Datumsangaben
     */
    public function validateDate($key,$value) {

        $pattern ='/^\d{1,2}(.|-)\d{1,2}(.|-)\d{1,4}$/';
        
        if (preg_match($pattern,$value)){
            return true;
        }else{
            $this->errorMessages[$key] = $this->variables['datum'][1];
            return false;
        }
    }

    /**
     * Callback: validiert Uhrzeit
     *
     */
    public function validateTime($key,$value) {

        $pattern ='/^\d{1,2}:\d{1,2}/';

        if (preg_match($pattern,$value)){
            return true;
        }else{
            $this->errorMessages[$key] = $this->variables[$key][1];
            return false;
        }
    }


    /**
     * TODO: Dokumentieren
     *
     */
    public function validateNotEmpty($key,$value) {
        return empty($value) ?
        ($this->errorMessages[$key] = $this->variables[$key][1]) && false : true;
    }


    /**
     * Gibt eine Zusammenfassung aller gesammelter Formulardaten zurück
     * 
     * @return <type>
     */
    public function getDataSummary() {
        $content ='';

        foreach($this->variables as $key => $val){
            if($this->variables[$key])
                $content .= $this->variables[$key][0] . ": " . htmlspecialchars($this->sourceData[$key]) . "\r\n";
        }

        return $content;
    }
    
} //class

?>
